package com.ruoyi.common.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonGenerator.Feature;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {

    /**
     * 序列化BigDecimal值到JSON输出
     *
     * @param bigDecimal 要序列化的BigDecimal值，可能为null
     * @param jsonGenerator 用于写入JSON内容的生成器
     * @param serializerProvider 提供序列化功能的上下文提供者
     * @throws IOException 如果在写入过程中发生IO错误
     */
    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        // 如果值为null，直接写入null值到JSON输出
        if (bigDecimal == null) {
            jsonGenerator.writeNull();
            return;
        }

        // 检查是否已启用WRITE_BIGDECIMAL_AS_PLAIN特性
        // 该特性确保BigDecimal以普通数字格式而非科学计数法输出
        boolean isEnabled = jsonGenerator.isEnabled(Feature.WRITE_BIGDECIMAL_AS_PLAIN);
        if (!isEnabled) {
            jsonGenerator.enable(Feature.WRITE_BIGDECIMAL_AS_PLAIN);
        }

        try {
            // 将BigDecimal值写入JSON输出
            jsonGenerator.writeNumber(bigDecimal);
        } finally {
            // 如果之前未启用WRITE_BIGDECIMAL_AS_PLAIN特性，则在写入完成后将其禁用
            // 保证不改变原始的jsonGenerator状态
            if (!isEnabled) {
                jsonGenerator.disable(Feature.WRITE_BIGDECIMAL_AS_PLAIN);
            }
        }
    }
}
